/*-
 * Copyright (c) 2010 Xin LI <delphij@FreeBSD.org>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#define memchr memchr_new
#include "../../../libc/string/memchr.c"
#undef memchr

void * memchr(const void *, int, size_t); 

#include <stdio.h>
#include <stdlib.h>

#define ARRAYSIZE 4096

int
main(void)
{
	int i, j, k, res = 0;
	char *p, *rva, *rvb, *rvc;

	p = malloc(ARRAYSIZE);
	memset(p, 'A', ARRAYSIZE);

	/*
	 * Set only one byte in the whole array to 'a'
	 */
	for (i = 0; i < ARRAYSIZE; i++) {
		p[i] = 'a';

		/*
		 * Scan in [j, k] area for 'a'
		 */
		for (j = ARRAYSIZE; j > 0; j--) {
		    for (k = ARRAYSIZE - j; k > 0; k--) {
			rva = memchr_new(p + j, 'a', k);
			rvb = memchr(p + j, 'a', k);
			rvc = ((i >= j && i < (j+k)))? p + i : NULL;
			if (rva != rvb || rva != rvc) {
				printf("rva=%p rvb=%p rvc=%p\n", rva, rvb, rvc);
			}
			res += (rvc - rva);
		    }
		}
		p[i] = 'A';
	}
	printf("%d\n", res);
	if (res != 0)
		exit(1);
	exit(0);
}

